package com.service.impl;

import com.bean.Books;
import com.dao.BooksDao;
import com.dao.impl.BooksDaoImpl;
import com.service.BooksService;
import net.sf.json.JSONObject;
import org.apache.commons.codec.digest.DigestUtils;
import util.ConfigUtil;
import util.DateUtil;

import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by Administrator on 2018/11/23.
 */
public class BooksServiceImpl implements BooksService {
    BooksDao booksDao = new BooksDaoImpl();

    /**
     * 方法概述：账号登录
     *
     * @param books
     * @return
     */
    @Override
    public String getAccount(Books books) {
//        把对象数据传入dao层并获取返回账号信息
        Books b = booksDao.getPwd(books);

        if (b != null) {
//         判断账户是否存在
            if (books.getAccount().equals(b.getAccount())) {
//                判断密码是否正确
                if (books.getPwd().equals(b.getPwd())) {

                    return "登录成功";
                } else {
                    return "密码错误";
                }
            }
        }
        return "账号错误";
    }

    /**
     * 随机生成验证码
     *
     * @return
     */
    public int addCode() {

        int code = (int) (Math.random() * (999999 - 100000 + 1)) + 100000;
        return code;
    }

    /**
     * 方法概述：封装短信内容
     *
     * @return
     */
    public String smsContent() {
        return "【码教授】您的验证码为" + addCode() + "，请于3分钟内正确输入，如非本人操作，请忽略此短信。";
    }

    /**
     * 方法概述：获取时间戳
     */
    public String timesTamp() {
        String timestamp = DateUtil.stringDate(new Date(), "yyyyMMddHHmmss");
        return timestamp;
    }

    /**
     * 方法概述： 发送短信和验证手机账号是否存在
     * @param phone
     * @return
     */
    public String up(String phone) {
//        获取验证码
        String code1 = addCode() + "";
//        获取时间戳
        String time = timesTamp();
//        提交验证码给后台 存入数据库
        if (booksDao.getPhone(phone, code1)) {
//            发送短信
            if (getPhone(phone, time)) {
                return "短信发送成功 请注意查收";
            } else {
                return "短信发送失败 请稍后再试";
            }
        }
        return "该手机手机号码未注册";
    }

    /**
     * 方法概述：验证手机注册时验证码是否输入正确
     * @param phoneRig
     * @param codeRig
     * @return
     */
    @Override
    public String getCodeRig(String phoneRig, String codeRig) {
//        获取返回的该登录手机账户的验证信息
        HashMap books = booksDao.getCodeRig(phoneRig,codeRig);
        if (books.get("phone")!= null) {
            if (books.get("code").equals(codeRig)) {
//                把String 时间 转为long
               long date=Long.valueOf((String) books.get("date"));
                if (date>=getDate()) {
                    booksDao.addPhoneRig(phoneRig);
                    return "注册成功";
                }else {
                    booksDao.delCodeRig(phoneRig);
                    return "验证码过期";
                }
            } else {
                booksDao.delCodeRig(phoneRig);
                return "验证码错误";
            }
        }
        booksDao.delCodeRig(phoneRig);
        return "没找到注册的手机号码";

    }

    /**
     * 方法概述：发送短信
     *
     * @param phone
     * @return
     */
    @Override
    public boolean getPhone(String phone, String time) {
//       生成签名
        String sig = sign(time);
        String respDataType = "JSON";
//      8封装请求参数
        String param = getParam(smsContent(), phone, time, sig, respDataType);
        try {
//              获取返回信息
            String jsonText = send(param);
            System.out.println(jsonText);
//                  把字符串转换为JSON的对象
            JSONObject json = JSONObject.fromObject(jsonText);
//                     从返回的信息中获得状态码
            String resultCode = json.get("respCode").toString();
//               判断是否成功

            if (resultCode.equals("00000")) {
//                等于00000 表示成功
                return true;
            } else {
                return false;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }

//    public static void main(String[] args) {
//        System.out.println( DateUtil.stringDate(new Date(),"yyyyMMddHHmmss"));
//    }

    public long getDate(){
        String date1 = DateUtil.stringDate(new Date(),"yyyy-MM-dd HH:mm:ss.SSS");
        String d= DateUtil.TimeStamp(date1,"yyyy-MM-dd HH:mm:ss.SSS");
        long da = Long.valueOf(d);
        return da;
    }
    /**
     * 方法概述 ： 验证手机登录
     *
     * @param books
     * @return
     */
    @Override
    public String getCode(Books books) {
        Map map = booksDao.getCode(books.getPhone());
        if (map.get("phone")!= null) {
            if (map.get("code").equals(books.getVeriCode())) {
//                把String 时间 转为long
                long date=Long.valueOf((String) map.get("date"));
                if (date>=getDate()) {
                    // 修改验证码 改为0
                    booksDao.delCode(books.getPhone());
                    return "登录成功";
                }else {
                    return "验证码过期";
                }
            } else {
                return "验证码错误";
            }
        }
        return "手机账号错误";
    }

    /**
     * 方法概述 ：注册账号
     *
     * @param books
     * @return
     */
    @Override
    public String getAccountRig(Books books) {
        if (booksDao.getAccountRig(books.getAccount())) {
            if (booksDao.addAccount(books)) {
                return "注册成功";
            }else {
                return "注册失败";
            }
        }
        return "账号已存在";
    }

    /**
     * f方法概述： 手机注册 发送验证码
     *
     * @param phoneRig
     * @return
     */
    @Override
    public String getPoneRig(String phoneRig) {
        String code1 = addCode() + "";
        String date = timesTamp();
        System.out.println(phoneRig);
        System.out.println(booksDao.getPhoneRig(phoneRig));
        if (booksDao.getPhoneRig(phoneRig)) {
            booksDao.addRig(phoneRig, code1);
            if (getPhone(phoneRig, date)) {
                return "短信发送成功 请注意查收";
            } else {
                return "短信发送失败 请稍后再试";
            }
        }
        return "该手机手机号码已注册";

    }

    /**
     * f方法概述： 签名md5加密
     *
     * @param timestamp
     * @return
     */
    public String sign(String timestamp) {
        String account_sid = ConfigUtil.ACCOUNT_SID;
        String auth_Token = ConfigUtil.AUTH_TOKEN;

        return DigestUtils.md5Hex(account_sid + auth_Token + timestamp);
    }

    /**
     * 方法概述： 封装请求参数
     *
     * @param smsContent
     * @param phone
     * @param timestamp
     * @param sig
     * @param respDataType
     * @return
     */
    public String getParam(String smsContent, String phone, String timestamp, String sig, String respDataType) {

        StringBuffer sb = new StringBuffer();
        sb.append("accountSid=")
                .append(ConfigUtil.ACCOUNT_SID)
                .append("&smsContent=")
                .append(smsContent)
                .append("&to=")
                .append(phone)
                .append("&timestamp=")
                .append(timestamp)
                .append("&sig=")
                .append(sig)
                .append("&respDataType=")
                .append(respDataType);
        return sb.toString();
    }

    /**
     * 发送短信
     *
     * @param param
     * @return
     * @throws IOException
     */
    public String send(String param) throws IOException {
        URL url = new URL(ConfigUtil.SMS_URL);
//建立连接
        URLConnection conn = url.openConnection();

        //3.连接的参数设置
        conn.setConnectTimeout(2000);  //超时时间
        conn.setDoInput(true);//表示是否允许向流中邪数据
        conn.setDoOutput(true);//表示是否可以获得输出的信息
//3.从连接中获得输出流
        OutputStream os = conn.getOutputStream();
//       字节流 转换为输入流
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
//发送请求
        bw.write(param);
        bw.flush();

        //获得秒滴的返回结果
        InputStream is = conn.getInputStream();

        //把节点流转换为字符流
        BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));

        StringBuffer sb = new StringBuffer();
        String line = "";
        while ((line = br.readLine()) != null) {
            sb.append(line);
        }

        br.close();
        is.close();
        os.close();
        bw.close();
        return sb.toString();
    }

}
